iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
Software Development

Unity遊戲開發與實踐-BlueRemedy內容分享系列 第 7

[Day7] 主角-基本操作(跳躍篇)

  • 分享至 

  • xImage
  •  

延續前一天的基本移動,今天的目標是完成角色跳躍設定。


跳躍

跳躍設定在2D橫向卷軸遊戲中可說是個畫龍點睛的功能。跳躍能為遊戲增添垂直方向操作的樂趣,透過不一樣的跳躍高度、跳躍節奏都能帶給玩家不一樣的體驗。而今天的文章將會先帶入最基本的跳躍,進而補充我在BlueRemedy中針對跳躍設計的操作細節。

Step1:

首先快速設定好基本版的跳躍:
先創立以下三個變數

  • jumpForce,用來設定跳躍時施予主角的力
  • footPoint,用來記錄Player物件腳下的點,設為public並從Inspector中做設定
  • touchGround,則是用來記錄是否觸地的布林變數
    https://ithelp.ithome.com.tw/upload/images/20200913/20130414HJPjOx9Smd.jpg
    https://ithelp.ithome.com.tw/upload/images/20200913/20130414N9uWZSdcsk.jpg

為甚麼要特別設定touchGround呢? 他的意思就像我們要踩在地上才能往上跳,假如現在已經騰空了還能跳躍嗎,答案肯定是不行的。

Step2:

接下來設定touchGround的判斷,如同前一天說的,我習慣將功能包在函式中以便修改。這裡我創建一個PointCheck函式用來做所有偵測工作,並在Update函式中不斷呼叫。

因為這個偵測工作不像Move那麼要求固定更新頻率所以放在Update就可以了。

在PointCheck函式中使用Physics2D.OverlapCircle功能,他是甚麼意思呢? 就是以footPoint (剛設定的腳下的點)為中心,畫半徑0.15單位的圓,偵測圓內有沒有"Ground & Wall"或"Platform"這兩個Layer的物件,並將結果true/false回傳給touchGround變數。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414eX1YUyIoDO.jpg

大概是下面這張圖的概念,特別在腳下畫了個圓型框以便理解。這個圓的半徑需要不斷嘗試才能找到適當的值。如果太大,腳色還沒碰到地上就又可以起跳了;如果太小,就得等主角真的完全碰到地板才能再起跳,對於操作的靈活度是大大扣分。
https://ithelp.ithome.com.tw/upload/images/20200913/201304148C5H7oAiwD.jpg

Step3:

再設一個Jump函數並用FixedUpdate持續呼叫,函式中設定當Jump按鍵按下且是觸地狀態時,施予一個向上的力。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414MoU4EAcv9i.jpghttps://ithelp.ithome.com.tw/upload/images/20200913/20130414lIq6vtKruZ.jpg

到這邊為止最基礎的跳躍完成了,看看成果吧

細節設定

實際操作後發現一個小問題,因為關卡中的地形並不是完全平的,移動時有可能會因此騰空,這也導致騰空時沒辦法立即跳躍。聽起來很符合物理對吧,但在遊戲中這很影響操作體驗!

Step1:

接下來將針對這個問題做改造。宣告一個新的布林變數canJump,觸地時設為true;非跳躍的騰空時,過小小段時間才會變為false,作為緩衝。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414vDHzK38PcA.jpg

Step2:

然後作以下更改,當touhGround時設定canJump為true,並且Jump函式中跳躍的條件從touhGround改為canJump。跳起時設定canJump為false
https://ithelp.ithome.com.tw/upload/images/20200913/20130414mOetaVDMOt.jpg

Step3:

創建一個IEnumerator函式canJump_dead(),當touchGround為false時呼叫。IEnumerator真的超好用,它的特點就是能做到類似背後執行,例如下圖中我呼叫後他會等待0.2秒後才作後續動作,不懂的人自己去查資料!
https://ithelp.ithome.com.tw/upload/images/20200913/20130414DxRbjZBBO4.jpg

Step4:

但尷尬的是,也可能造成以下狀況:騰空的瞬間他開始計時,然而只騰空0.1秒就又落地,當到達0.2秒時即使主角正踩在地上,依樣會被設定canJump=false,所以需要再一個機制控制當他落地時立刻停止運作中的計時。

宣告一個Coroutine cor_canJump_dead,當呼叫IEnumerator函式時把他指定到Coroutine變數中。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414jYPtTuFwQl.jpg
https://ithelp.ithome.com.tw/upload/images/20200913/20130414G5OX3sqZTi.jpg

Step5:

然後在設定當落地時,假如正在計時(即cor_canJump_dead!=null),就將他強制停止。還有要設定為如果已經開始在計時了就不再呼叫計時
https://ithelp.ithome.com.tw/upload/images/20200913/20130414FkdodNzSUB.jpg


上一篇
[Day6] 主角-基本操作(移動篇)
下一篇
[Day8] 主角-基本操作(蹬牆跳躍篇)
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
新靈基湯
iT邦新手 5 級 ‧ 2020-09-15 15:10:55

寫得好詳細~等不及要看接下來的文章了!!

我要留言

立即登入留言